home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 38 / Amiga Format CD38 (1999-03-15)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-04].iso / -screenplay- / hd_installers / turrican2hd / src / diskreader.asm next >
Assembly Source File  |  1999-02-08  |  6KB  |  377 lines

  1. ; diskreader.asm - essential functionality for game disk installers.
  2. ; © 1998-1999 Kyzer/CSG
  3.  
  4.     include    devices/trackdisk.i
  5.     include    dos/dos.i
  6.     include    lvo/exec_lib.i
  7.     include    lvo/dos_lib.i
  8.  
  9.     IFND    FILEMODE
  10. FILEMODE=0
  11.     ENDC
  12.     IFND    TRACKMODE
  13. TRACKMODE=0
  14.     ENDC
  15.  
  16.  
  17. DOSTRACKLEN=TD_SECTOR*NUMSECS
  18.  
  19. MAKEBUF    MACRO    ; buffername
  20.     section    trackbuf,bss,chip
  21. \1
  22. __trk    ds.b    $7ffe
  23.     ENDM
  24.  
  25. FAILURE    MACRO    ; [reason]
  26.     IFEQ    NARG
  27.     suba.l    a0,a0
  28.     ELSE
  29.     lea    \1,a0
  30.     ENDC
  31.     bra    __fail
  32.     ENDM
  33.  
  34.     IFEQ    FILEMODE
  35. WRITE    MACRO    ; length
  36.     lea    __trk,a0
  37.     move.l    \1,d0
  38.     bsr    __write
  39.     ENDM
  40. WRITEDOS MACRO    ; track
  41.     DOSREAD    \1
  42.     WRITE    #DOSTRACKLEN
  43.     ENDM
  44.     ENDC
  45.  
  46. SAVEF    MACRO
  47.     lea    \1,a0
  48.     lea    \2,a1
  49.     move.l    \3,d0
  50.     bsr    __write
  51.     ENDM
  52.  
  53.     IFEQ    TRACKMODE
  54. RESYNC    MACRO    ; sync
  55.     lea    __trk,a0
  56.     move.l    \1,d0
  57.     bsr    __sync
  58.     ENDM
  59.  
  60. RAWREAD    MACRO    ; track
  61.     lea    __trk,a0
  62.     move.l    \1,d0
  63.     bsr    __rawrd
  64.     ENDM
  65.     ENDC
  66.  
  67. DOSREAD    MACRO    ; track
  68.     lea    __trk,a0
  69.     move.l    \1,d0
  70.     bsr    __dosrd
  71.     ENDM
  72.  
  73. ;------------------------------------
  74.  
  75. call    macro
  76.     jsr    _LVO\1(a6)
  77.     endm
  78.  
  79. initstk    macro    ; stack_symbol, stackreg
  80.     link    \2,#\1
  81.     move.l    sp,a0
  82. .clr\@    clr.w    (a0)+
  83.     cmp.l    a0,\2
  84.     bne.s    .clr\@
  85.     endm
  86.  
  87. stackf    MACRO    ; stack_symbol, stackelement_symbol, [size=4]
  88.     IFND    \1
  89. \1    set    0
  90.     ENDC
  91.     IFGE    NARG-3
  92. \1    set    \1-(\3)
  93.     ELSE
  94. \1    set    \1-4
  95.     ENDC
  96. \2    equ    \1
  97.     ENDM
  98.  
  99.     IFNE    FILEMODE
  100.     IFNE    TRACKMODE
  101.  
  102.     ; filemode on, trackmode on
  103.     stackf    stk, unit
  104.     stackf    stk, device
  105. __args=device
  106. __nargs=2
  107. __tmpl    macro
  108.     dc.b    'DEVICE/A,UNIT/N/A',0
  109.     endm
  110.  
  111.     ELSE
  112.  
  113.     ; filemode on, trackmode off
  114.     stackf    stk, unit
  115. __args=unit
  116. __nargs=1
  117. __tmpl    macro
  118.     dc.b    'UNIT/N/A',0
  119.     endm
  120.  
  121.     ENDC
  122.     ELSE
  123.     IFNE    TRACKMODE
  124.  
  125.     ; filemode off, trackmode on
  126.     stackf    stk, unit
  127.     stackf    stk, device
  128.     stackf    stk, output
  129. __args=output
  130. __nargs=3
  131. __tmpl    macro
  132.     dc.b    'DISKFILE/A,DEVICE/A,UNIT/N/A',0
  133.     endm
  134.  
  135.     ELSE
  136.  
  137.     ; filemode off, trackmode off
  138.     stackf    stk, unit
  139.     stackf    stk, output
  140. __args=output
  141. __nargs=2
  142. __tmpl    macro
  143.     dc.b    'DISKFILE/A,UNIT/N/A',0
  144.     endm
  145.  
  146.     ENDC
  147.     ENDC
  148.  
  149.     stackf    stk, rdargs
  150.     stackf    stk, execbase
  151.     stackf    stk, dosbase
  152.     stackf    stk, diskport
  153.     stackf    stk, diskio
  154.     stackf    stk, outfh
  155.     stackf    stk, initsp
  156.     stackf    stk, reason
  157.     stackf    stk, retcode
  158.  
  159.     section    diskreader,code
  160.  
  161.     link    a5,#stk
  162.     move.l    4.w,a6
  163.     move.l    a6,execbase(a5)
  164.  
  165.     moveq    #20,d7        ; returncode = 20
  166.  
  167.     moveq    #37,d0
  168.     lea    dosname(pc),a1
  169.     call    OpenLibrary
  170.     move.l    d0,dosbase(a5)
  171.     beq    .nodos
  172.     move.l    d0,a6
  173.  
  174.     clr.l    reason(a5)
  175.  
  176.     lea    templat(pc),a0
  177.     move.l    a0,d1
  178.     lea    __args(a5),a0
  179.     move.l    a0,d2
  180.     REPT    __nargs
  181.     clr.l    (a0)+
  182.     ENDR
  183.     moveq    #0,d3
  184.     call    ReadArgs
  185.     move.l    d0,rdargs(a5)
  186.     IFEQ    FILEMODE
  187.     beq    .noargs
  188.     move.l    output(a5),d1
  189.     move.l    #MODE_NEWFILE,d2
  190.     call    Open
  191.     move.l    d0,outfh(a5)
  192.     beq.s    .nofile
  193.     ELSE
  194.     beq.s    .noargs
  195.     ENDC
  196.  
  197.     move.l    execbase(a5),a6
  198.     call    CreateMsgPort
  199.     move.l    d0,diskport(a5)
  200.     beq.s    .noport
  201.  
  202.     move.l    d0,a0
  203.     moveq    #IOTD_SIZE,d0
  204.     call    CreateIORequest
  205.     move.l    d0,diskio(a5)
  206.     beq.s    .noio
  207.  
  208.     move.l    d0,a1
  209.     move.l    unit(a5),a0
  210.     move.l    (a0),d0
  211.     IFNE    TRACKMODE
  212.     move.l    device(a5),a0
  213.     ELSE
  214.     lea    tdname(pc),a0
  215.     ENDC
  216.     moveq    #0,d1
  217.     call    OpenDevice
  218.     tst.l    d0
  219.     bne.s    .nodev
  220.  
  221.     bsr    __main
  222.  
  223.     move.l    diskio(a5),a1
  224.     move.w    #TD_MOTOR,IO_COMMAND(a1)
  225.     clr.l    IO_LENGTH(a1)
  226.     move.l    execbase(a5),a6
  227.     call    DoIO
  228.     
  229.     move.l    diskio(a5),a1
  230.     call    CloseDevice
  231. .nodev    move.l    diskio(a5),a0
  232.     call    DeleteIORequest
  233. .noio    move.l    diskport(a5),a0
  234.     call    DeleteMsgPort
  235. .noport    move.l    outfh(a5),d1
  236.     move.l    dosbase(a5),a6
  237.     IFEQ    FILEMODE
  238.     call    Close
  239. .nofile
  240.     ENDC
  241.     move.l    rdargs(a5),d1
  242.     call    FreeArgs
  243. .noargs
  244.     moveq    #0,d7         ; returncode = 0
  245.     call    IoErr
  246.     move.l    d0,d1
  247.     beq.s    .nofail
  248.     moveq    #20,d7        ; returncode = 20
  249. .nofail    move.l    reason(a5),d2
  250.     call    PrintFault
  251.  
  252.     move.l    dosbase(a5),a1
  253.     move.l    execbase(a5),a6
  254.     call    CloseLibrary
  255. .nodos    move.l    d7,d0
  256.     unlk    a5
  257.     rts
  258.  
  259. ;------------------------------------
  260. ; a0 = buffer, d0 = track
  261. __dosrd    move.l    diskio(a5),a1
  262.     move.w    #CMD_READ,IO_COMMAND(a1)
  263.     move.l    #__trk,IO_DATA(a1)
  264.     move.l    #DOSTRACKLEN,d1
  265.     mulu    d1,d0
  266.     move.l    d0,IO_OFFSET(a1)
  267.     move.l    d1,IO_LENGTH(a1)
  268.     move.l    execbase(a5),a6
  269.     call    DoIO
  270.     lea    errtrk(pc),a0
  271.     tst.l    d0
  272.     bne.s    __fail
  273.     rts
  274.  
  275.     IFEQ    TRACKMODE
  276. ;------------------------------------
  277. ; a0 = buffer, d0 = track
  278. __rawrd    move.l    diskio(a5),a1
  279.     move.w    #TD_RAWREAD,IO_COMMAND(a1)
  280.     move.b    #IOTDB_INDEXSYNC,IO_FLAGS(a1)
  281.     move.l    a0,IO_DATA(a1)
  282.     move.l    d0,IO_OFFSET(a1)
  283.     move.l    #$7ffe,IO_LENGTH(a1)
  284.     move.l    execbase(a5),a6
  285.     call    DoIO
  286.     lea    errtrk(pc),a0
  287.     tst.l    d0
  288.     bne.s    __fail
  289.     rts
  290.     ENDC
  291.  
  292. ;------------------------------------
  293. ; a0 = failure reason
  294. __fail    move.l    a0,d0
  295.     beq.s    .noreas
  296.     move.l    d0,reason(a5)
  297.     move.l    dosbase(a5),a6
  298.     move.l    #ERROR_NOT_A_DOS_DISK,d1
  299.     call    SetIoErr
  300. .noreas    move.l    initsp(a5),sp
  301.     rts
  302.  
  303.     IFNE    FILEMODE
  304. ;------------------------------------
  305. ; a0 = filename, a1 = buffer, d0 = length
  306. __write    movem.l    d2-d4,-(sp)
  307.     move.l    a0,d1
  308.     move.l    a1,d3    ; d3 = buffer
  309.     move.l    d0,d4    ; d4 = length
  310.     move.l    #MODE_NEWFILE,d2
  311.     move.l    dosbase(a5),a6
  312.     call    Open
  313.     move.l    d0,d1    ; d1 = filehandle
  314.     move.l    d3,d2    ; d2 = buffer
  315.     move.l    d4,d3    ; d3 = length
  316.     move.l    d0,d4    ; d4 = filehandle
  317.     beq.s    __fail
  318.     call    Write
  319.     move.l    d0,d3
  320.     move.l    d4,d1
  321.     call    Close
  322.     tst.l    d3
  323.     bmi.s    __fail
  324.     movem.l    (sp)+,d2-d4
  325.     rts
  326.  
  327.     ELSE
  328. ;------------------------------------
  329. ; a0 = buffer, d0 = length
  330. __write    movem.l    d2-d3,-(sp)
  331.     move.l    a0,d2
  332.     move.l    d0,d3
  333.     move.l    outfh(a5),d1
  334.     move.l    dosbase(a5),a6
  335.     call    Write
  336.     tst.l    d0
  337.     bmi.s    __fail
  338.     movem.l    (sp)+,d2-d3
  339.     rts
  340.     ENDC
  341.  
  342.     IFEQ    TRACKMODE
  343. ;------------------------------------
  344. ; a0 = buffer d0 = sync
  345. __sync    movem.l    d2-d3,-(sp)
  346.     move.l    a0,a1
  347.     move.w    #($7ffe/2)-1,d2
  348. .nxtwrd    moveq    #16-1,d3
  349. .nxtbit    move.l    (a0),d1
  350.     lsr.l    d3,d1
  351.     cmp.w    d0,d1
  352.     beq.s    .synced
  353.     dbra    d3,.nxtbit
  354.     addq.l    #2,a0
  355.     dbra    d2,.nxtwrd
  356.     lea    errsync(pc),a0
  357.     bra.s    __fail    ; no sync marker found
  358. .synced    move.l    (a0),d1
  359.     addq.l    #2,a0
  360.     lsr.l    d3,d1
  361.     move.w    d1,(a1)+
  362.     dbra    d2,.synced
  363.     moveq    #0,d0        ; succeeded
  364.     movem.l    (sp)+,d2-d3
  365.     rts
  366. errsync    dc.b    "can't find sync mark",0
  367.     ENDC
  368.  
  369. dosname    DOSNAME
  370. tdname    TD_NAME
  371. templat    __tmpl
  372. errtrk    dc.b    "error reading track",0
  373.     cnop    0,4
  374.  
  375. ;------------------------------------
  376. __main    move.l    sp,initsp(a5)
  377.